package main

import "fmt"

func main() {
	names := []string{"北京", "上海", "广州", "深圳", "武汉", "苏州", "南京"}

	//基于names创建一个新的数组
	/*names1 := []string{}
	names1[0] = names[0]
	names1[1] = names[1]
	names1[2] = names[2]*/

	//切片可以基于一个数组，灵活的创建新的数组
	names2 := names[0:3]
	fmt.Println(names2)

	names2[2] = "Hello"
	fmt.Println(names2)
	fmt.Println(names)

	//1.如果从0元素开始截取，那么冒号左边的数字可以省略
	names3 := names[:5]
	fmt.Println("names3", names3)

	//2.如果截取到最好一位数，那么冒号右边的数字可以省略
	names4 := names[2:]
	fmt.Println("names4", names4)

	//3.如果从左至右全部使用，那么冒号左右边的数字可以省略
	names5 := names[:]
	fmt.Println("names5", names5)

	//4.也可以基于一个字符串进行切片截取 ： 取字符串的子串 helloworld
	sub1 := "helloworld"[5:7]
	fmt.Println("sub1", sub1)

	//5.可以在创建空切片的时候，明确指定切片的容量，这样可以提高运行效率
	//创建一个容量20，长度为0的string类型切片
	str2 := make([]string, 0, 20) //第三个参数不上必须的，如果没有填写，则默认与长度相同
	fmt.Println(str2, len(str2), cap(str2))

	//6.如果想让切片完全独立于原始数组，可以使用copy()函数完成
	namesCopy := make([]string, len(names))
	//func copy(dst,src []type) int
	//names是一个数组，copy函数接收的参数类型是一个切片，所以需要使用[:]将数组变成切片
	copy(namesCopy, names[:])
	namesCopy[0] = "hello"
	fmt.Println(namesCopy, len(namesCopy), cap(namesCopy))
	fmt.Println(names)
}
